// 蛇形转驼峰
String snakeToCamel(String str) {
  if (str.isEmpty) return str;
  if (str.contains("_")) {
    str = str.replaceAllMapped(RegExp(r'_(\w)'), (Match match) {
      return match.group(1)!.toUpperCase();
    });
  }
  return str;
}

// 驼峰转蛇形
String cameToSnake(String str) {
  if (str.isEmpty) return str;
  return str.replaceAllMapped(RegExp(r'([^A-Z])([A-Z])'), (Match match) {
    return '${match.group(1)}_${match.group(2)!.toLowerCase()}';
  });
}

// 首字母转大写
String uppercaseFirst(String str) {
  if (str.isEmpty) return str;
  return str[0].toUpperCase() + str.substring(1);
}

// 首字母转小写
String lowercaseFirst(String str) {
  if (str.isEmpty) return str;
  return str[0].toLowerCase() + str.substring(1);
}

// 固定长度插入字符
String insertLength(String str, [len = 4, separator = ' ']) {
  if (str.isEmpty) return str;
  return str.replaceAllMapped(RegExp('.{$len}'), (match) => '${match.group(0)}$separator');
}

// 金额千分位逗号分隔
String formatAmount(Object value) {
  return value.toString().replaceAll(RegExp(r'\B(?=(\d{3})+(?!\d))'), ',');
}

// 隐藏部分电话号码
String maskPhone(String str) {
  if (str.isEmpty) return str;
  return str.replaceRange(3, 7, '****');
}

// 获取字符串后缀
String getSuffix(String str, [separator = '.']) {
  if (str.isEmpty) return str;
  List parts = str.split(separator);
  return parts.last;
}
